package rohyunji;

public class J18_OOP4 {

	/*
	static
	일반적으로 객체를 생성하려면 생성자를 사용해야함
	하지만 생성자 없이 객체를 바로 사용할수 있음
	
	static에약어를 맴버변수나 메서드에 사용하면 객체생성 없이 바르 클래스를 사용
	
	static로 선언된 맴버변수는클래스명.맴버변수 형태로 사용
	static로 선언된 메서드는 클래스명.메서드 형태로 사용
	static로 선언된 맴버변수는 클래스(공용)변수 라고부르기도함
			이것과 유사하게 C에서는 전역변수라고 한다.
	즉, static이 초기화시점이빠르기때문에  (메인메서드 호출되는시점)
			호출되기전에 미리 메모리 영역에 변수공간이생성된다.
	반면에 객체는 main()메서드가 호출되고 해당클래스의 생성자가 호출되어야만 
	변수공간이 생성 
	
	프로그램 작성시 클래스는 용도(값,처리)에 따라 최소 2개이상으로 나눠 작성하는것을 추천
	
	
	 */
	public static void main(String[] args) {
		// TODO Auto-generated method stub

		Rent r20131107001=new Rent();
		r20131107001.rentno=351;//대여번호
		r20131107001.bookno=8746;//대여책번호
		r20131107001.memberno=68;//대여한사람번호
		r20131107001.showinfo();
		
		//static으로 선언된클래스 사용
		StaticRent.bookno=12345678;
		StaticRent.rentno=654;
		StaticRent.memberno=5678;
		
		//성적데이터 초기화
		SungJuk s1=new SungJuk();
		s1.kor=100; s1.eng=100;s1.mat=100;
		s1.tot=s1.showTotal();//메소드사용이유 :간결,코드보안
		
		//실무에선 용도별로 메소드 하지 않고  클래스 나눠서 짠다.!
		//s1.tot=s1.kor+s1.eng+s1.mat;
		
		//성적데이터 초기화
		SungJukVO sjvo=new SungJukVO(98,80,80);
		SungjukService1 sj=new SungjukService1();
		sjvo.tot=sj.getTotal(sjvo.kor, sjvo.eng, sjvo.mat);
		System.out.println(sjvo.tot);
		
		//static 메소드 
		sjvo.tot=SungjukService1.getTotal2(sjvo.kor, sjvo.eng, sjvo.mat);
		System.out.println(sjvo.tot);
		
		
		
	}//end of main

}

class Rent
{
	int rentno;
//	String booktitle;String genre;
	int bookno;
	int memberno;
	void showinfo()
	{
		System.out.print("대연번호="+rentno+",");
		System.out.print("책번호="+bookno+",");
		System.out.print("회원번호="+memberno+"\n");
	}
}
class StaticRent
{
	static int rentno;
//	String booktitle;String genre;
	static int bookno;
	static int memberno;
	String rantdate; //번지지정안된상태 
	
	static void showinfo()
	{
		System.out.print("대연번호="+rentno+",");
		System.out.print("책번호="+bookno+",");
		System.out.print("회원번호="+memberno);
//		System.out.print(rantdate); // static 메서드에서 인스턴스 변수 못씀
		
	}
}

class SungJuk
{
	int kor,eng,mat,tot;
	public SungJuk() {}
	public SungJuk(int kor,int eng,int mat) 
	{
		this.kor=kor; this.eng=eng; this.mat=mat;
	}
	int showTotal()
	{
		return kor+eng+mat;
	}
	
}

//성적클래스인데  성적에 관련된 데이터만 저장 
//즉 멤버변수만 존재하고 그것을 처리하는 메서드는 없음 
//값만 가지는 클래스 
class SungJukVO
{
	String name;
	int kor,eng,mat,tot;
	public SungJukVO() {}
	public SungJukVO(int kor,int eng,int mat) 
	{
		this.kor=kor;
		this.eng=eng;
		this.mat=mat;
	}
}

//성적 서비스 클래스 (총점,평균,학점 구하는 클래스)
class SungjukService1
{
	int getTotal(int kor,int eng,int mat)
	{
		return kor+eng+mat;
	}
	static int getTotal2(int kor,int eng,int mat)
	{
		return kor+eng+mat;
	}
	int getAvg(int kor,int eng,int mat)
	{
		return this.getTotal(kor, eng, mat)/3;
	}
	String getGrade(int kor,int eng,int mat)
	{
		return "아직";
	}
	
}